package com.hx.dynamic.demo2;

import com.hx.dynamic.demo1.Rent;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author： Huathy
 * @ClassPath： com.hx.dynamic.demo1.ProxyInvocationHandler
 * @Date： 2021-02-04 11:41
 * @Description： 自动生成代理类
 */

/**
 * InvocationHandler是由代理实例的调用处理程序实现的接口 。
 * 每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时，方法调用将被编码并分派到其调用处理程序的invoke方法。
 */
public class ProxyInvocationHandler implements InvocationHandler {

    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(
                this.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }

    /**
     * 处理代理实例，并返回结果
     *
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        /**
         * 动态代理的本质，就是使用反射机制实现。
         */
        log(method.getName());
        Object res = method.invoke(target, args);
        return res;
    }

    public void log(String msg) {
        System.out.println("===执行 " + msg + " 方法===");
    }

}
